x86: Fix RevF detection in powernow.c
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 23 Oct 2009 09:11:52 +0000 (10:11 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 23 Oct 2009 09:11:52 +0000 (10:11 +0100)
The PowerNow! driver does not support RevF and earlier parts.
The current code checks for RevF processors in a function that
is not called.  Change the code path so that RevF processors
are detected and the driver fails registration.

Also fix cpufreq_add_cpu() to handle unsuccessful registration.

Signed-off-by: Mark Langsdorf <mark.langsdorf@amd.com>
xen/arch/x86/acpi/cpufreq/powernow.c
xen/drivers/cpufreq/cpufreq.c

index 32af03119fd4d66da0b9340fdc3702b3e7003a9a..bcbcc25d356a99571037b87493651c95e055e19b 100644 (file)
@@ -273,59 +273,24 @@ static struct cpufreq_driver powernow_cpufreq_driver = {
 };
 
 unsigned int powernow_register_driver()
-{
-    unsigned int ret;
-    ret = cpufreq_register_driver(&powernow_cpufreq_driver);
-    return ret;
-}
-
-int powernow_cpufreq_init(void)
 {
     unsigned int i, ret = 0;
-    unsigned int max_dom = 0;
-    cpumask_t *pt;
-    unsigned long *dom_mask;
 
     for_each_online_cpu(i) {
         struct cpuinfo_x86 *c = &cpu_data[i];
-       if (c->x86_vendor != X86_VENDOR_AMD)
+        if (c->x86_vendor != X86_VENDOR_AMD)
             ret = -ENODEV;
-        else 
+        else
         {
             u32 eax, ebx, ecx, edx;
             cpuid(CPUID_FREQ_VOLT_CAPABILITIES, &eax, &ebx, &ecx, &edx);
             if ((edx & USE_HW_PSTATE) != USE_HW_PSTATE)
                 ret = -ENODEV;
-       }
+        }
         if (ret)
             return ret;
-        if (max_dom < processor_pminfo[i]->perf.domain_info.domain)
-            max_dom = processor_pminfo[i]->perf.domain_info.domain;
     }
-    max_dom++;
-
-    dom_mask = xmalloc_array(unsigned long, BITS_TO_LONGS(max_dom));
-    if (!dom_mask)
-        return -ENOMEM;
-    bitmap_zero(dom_mask, max_dom);
 
-    pt = xmalloc_array(cpumask_t, max_dom);
-    if (!pt)
-        return -ENOMEM;
-    memset(pt, 0, max_dom * sizeof(cpumask_t));
-
-    /* get cpumask of each psd domain */
-    for_each_online_cpu(i) {
-        __set_bit(processor_pminfo[i]->perf.domain_info.domain, dom_mask);
-        cpu_set(i, pt[processor_pminfo[i]->perf.domain_info.domain]);
-    }
-
-    for_each_online_cpu(i)
-        processor_pminfo[i]->perf.shared_cpu_map =
-            pt[processor_pminfo[i]->perf.domain_info.domain];
-
-    xfree(pt);
-    xfree(dom_mask);
-   
+    ret = cpufreq_register_driver(&powernow_cpufreq_driver);
     return ret;
 }
index 39cc7eba61f053e571b87fc59e6f8e74865df7ae..7ef193a987dd289368c30e4e9c2527eadddf2f5f 100644 (file)
@@ -143,6 +143,9 @@ int cpufreq_add_cpu(unsigned int cpu)
         !cpu_online(cpu))
         return -EINVAL;
 
+    if (!cpufreq_driver)
+        return 0;
+
     if (cpufreq_cpu_policy[cpu])
         return 0;